/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.controller;

import com.evangelion.core.bean.Grupo;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.bean.Usuario;
import com.evangelion.core.dao.InicioDao;
import com.evangelion.core.utils.MensajesFace;
import com.evangelion.web.filter.SecurityUtils;
import org.apache.commons.lang3.StringUtils;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;

/**
 * @author Kellycasma
 */

@ManagedBean
@ViewScoped
public class InicioController extends MensajesFace implements Serializable {

    private Usuario usuario;

    private String cuenta;

    private Usuario reqdObj;

    private boolean sessionExist;

    private Long tpInmueble;

    private List<SelectItem> listTpInmuebles;

    @ManagedProperty(value = "#{inicioDao}")
    private InicioDao inicioDao;

    public boolean isAdminUser() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        Usuario user = SecurityUtils.getUserFromSession(request);

        if (null == user) {
            return false;
        }

        Grupo group = user.getGrupo();
        String groupName = group.getNombre();

        if (StringUtils.isNotEmpty(groupName) && "Admin".equals(groupName)) {
            return true;
        }

        return false;
    }

    public boolean isSessionExist() {
        return sessionExist;
    }

    public void setSessionExist(boolean sessionExist) {
        this.sessionExist = sessionExist;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    @PostConstruct
    public void init() {
        usuario = new Usuario();
        getSession();
    }

    public void autenticar() throws IOException {
        Usuario userLogin = getUsuario();
        try {
            Usuario u = inicioDao.getExistUser(userLogin.getCuenta(), userLogin.getContrasena());
            if (u != null) {
                System.out.println("....................usuario rescatado:" + u.toString());
                if (userLogin.getContrasena().equals(u.getContrasena())) {
                    FacesContext context = FacesContext.getCurrentInstance();
                    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

                    SecurityUtils.addUserToSession(request, u);
                    context.getExternalContext().redirect("general/inicioseccion.xhtml");

                } else {
                    System.out.println("error...:");
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cuenta o contraseña Incorrecta", " "));

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("errorrrrrrrrrrrrrrrr...:" + e);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cuenta o/y Contraseña Incorrecto", " "));
        }

    }

    public void getSession() {
        // recupero usuario en sesion
        sessionExist = false;
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        if (request == null) {
            return;
        }
        HttpSession httpSession = request.getSession(false);
        SecurityUtils.getUserFromSession(httpSession);
        if (httpSession != null) {
            reqdObj = (Usuario) httpSession.getAttribute("UserSession");
            if (reqdObj != null) {
                sessionExist = true;
                Seccione seccion = (Seccione) httpSession.getAttribute("seccion");
                cuenta = "Bienvenido! " + reqdObj.getCliente().getNombre() + " | " + reqdObj.getGrupo().getNombre() + " | ";
                if (seccion != null) {
                    cuenta = cuenta + "Seccion: " + seccion.getNombre() + " | ";
                }
                System.out.println("USUARIO EN SESION ==> " + reqdObj.getCuenta() + " GRUPO ==> " + reqdObj.getGrupo());
            }
        }
    }

    public boolean hasSeccion() {

        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

        Seccione secci = SecurityUtils.getSeccion(request);

        if (secci != null) {
            return true;
        }

        return false;
    }

    public boolean mostrarInforme() {
        boolean valor = false;
        if (hasSeccion()) {
            if (reqdObj.getGrupo().getNombre().equals("Admin")) {
                valor = true;
            }
        }

        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        HttpSession httpSession = request.getSession(false);
        if (httpSession != null) {
            Usuario user = (Usuario) httpSession.getAttribute("UserSession");
            if (user != null) {
                if (user.getGrupo().getNombre().equals("Admin")) {
                    valor = true;
                }
                System.out.println("mostrar informe:" + valor);
            }
        }
        return valor;
    }

    public void cerrarSession() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        context.getExternalContext().redirect(request.getContextPath() + "/logout.jsp");
    }

    public String getCuenta() {
        return cuenta;
    }

    public void setCuenta(String cuenta) {
        this.cuenta = cuenta;
    }

    public InicioDao getInicioDao() {
        return inicioDao;
    }

    public void setInicioDao(InicioDao inicioDao) {
        this.inicioDao = inicioDao;
    }
}
